/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package master_server;

import java.sql.*;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Renaud , Karen , François
 */

/*
 *  JDBC - Connector
 * La base de donnees est utilisee pour l'historique ainsi qu'un calcul du
 * classement actuel en dernier lieu il faudra permettre une recherche des
 * statistiques
 */
public class BddMastermind{

    private Connection connec;
    private Statement requete;
    private ResultSet resultat;   // faut voir s'il ne faut pas créer une variable seulement quand on a besoin    

    public BddMastermind() {
        // permet de se connecter a une base de donnees
        // en chargeant le driver on cree le lien entre ce programme et la base de donnees
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(BddMastermind.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void connexion() {  
        if (connec != null) {
            return;
        }
        try {
            // on charge et on configure le driver de la base de données via la classe DriverManager
            //bddmastermind est le nom de la base de donnees , root le nom d'utilisateur , et le dernier est le mot de passe
            connec = DriverManager.getConnection("jdbc:mysql://localhost/bddmastermind", "root", "");
            System.out.println(" Connection en cours ...");
            //con = DriverManager.getConnection(URL_SQLSERVER);
        } // si la connection n'a pas pu se faire
        catch (SQLException ex) {
            Logger.getLogger(BddMastermind.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    // met en place la requête ecrite et l'execute 

    public void traiterRequete() throws SQLException {
        Scanner entree = new Scanner(System.in);
        System.out.println("Entrez votre requete Sql : ");
        String sql = entree.nextLine();
        requete = connec.createStatement();
        System.out.println(sql);
        resultat = requete.executeQuery(sql);

    }
    // insere le joueur dans la base de donnees

    public void insererJoueur(String pseudoJ) throws SQLException {
        requete = connec.createStatement();
        String sql = "Insert into joueur('pseudo')VALUES('" + pseudoJ + "')";
        requete.executeQuery(sql);
    }

    // insere le joueur Avec son pass dans la base de donnees renvoie false si user existe
    public boolean insererJoueur(String pseudoJ, String pass) throws SQLException {
        boolean out = false;
        if (joueurExistant(pseudoJ) == false) {
            requete = connec.createStatement();
            // System.out.println("je bugg ici");
            String sql = "Insert into joueur (pseudo, pass) VALUES('" + pseudoJ + "','" + pass + "')";
            requete.executeUpdate(sql);
            out = true;
            // System.out.println("ca pla&nte ici dans bdd");
        } else {
            System.out.println("Joueur exist déjà");
        }
        return out;
    }

    // insere une nouvelle configuration supplementaire pour le jeu
    
    public void ajouterConfig(String difficulte, int col, int coul) throws SQLException {
        requete = connec.createStatement();
        String sql = "Insert into configuration('mode','colonnes','couleurs')VALUES('" + difficulte + "','" + col + "','" + coul + "')";
        requete.executeUpdate(sql);
    }

    // insere la partie dans l'historique
    
    public void insererPartie(int idConfig, int idJoueur, int leScore) throws SQLException {  //ok
        requete = connec.createStatement();
        String sql = "INSERT INTO historique(config, joueur, score)VALUES(" + idConfig + "," + idJoueur + "," + leScore + ")";
        requete.executeUpdate(sql);
    }
    // insere la partie dans l'historique ( avec Nom joueur et pas son ID)  ///------------------------------------- à tester 

    public void insererPartie(int idConfig, String nomJoueur, int leScore) throws SQLException {
        requete = connec.createStatement();
        System.out.println(" iincert partie" + idConfig + " nom " + nomJoueur + " score " + leScore);
        String sql = "INSERT INTO historique(config, joueur, score) SELECT " + idConfig + ", joueur.idJ ," + leScore + " FROM joueur WHERE joueur.pseudo = '" + nomJoueur + "'";
        requete.executeUpdate(sql);
    }

    // recherche un joueur existant
    public boolean joueurExistant(String pseudoJ) throws SQLException {
        requete = connec.createStatement();

        String sql = ("Select count(idJ) as existe from Joueur where pseudo ='" + pseudoJ + "'");

        resultat = requete.executeQuery(sql);
        resultat.next();
        System.out.println("je suis dans verif exist joueur");
        // System.out.println(" ... "+resultat.getInt(1));

        return resultat.getInt(1) > 0;

    }

    // recherche un joueur existant => verif de login et pass à finir 
    public boolean joueurExistant(String pseudoJ, String pass) throws SQLException {
        requete = connec.createStatement();
        String sql = "Select count(idJ) as existe from Joueur where pseudo = '" + pseudoJ + "' and pass ='" + pass + "'";
        resultat = requete.executeQuery(sql);
        resultat.next();
        return resultat.getInt("existe") > 0;
    }

    // ferme la connection a la base de donnees
    public void deconnexion() {
        try {
            connec.close();
            System.out.println(" Deconnection en cours ...");
        } catch (SQLException ex) {
            Logger.getLogger(BddMastermind.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // il faut une function qui va renvoyer un idconfig enfunction des donnes
    public int getIdconf(int colonnes, int couleurs) throws SQLException {
        int out;
        requete = connec.createStatement();
        String sql = "Select idC as existe from configuration where colonnes = " + colonnes + " and couleurs = " + couleurs;
        resultat = requete.executeQuery(sql);
        resultat.next();
        out = Integer.parseInt(resultat.getString(1));  // je ne sais pas si c'est correct
        return out;
    }

    public String[] getUStats(String nom) throws SQLException {
        // recuperer  les top scores d'un joueur preci ...           pas encore fini ...
        String[] out = new String[3];

        requete = connec.createStatement();   // il faut le best score pour easy  medium et hard  ---- faut affiner le code sql
        String sql = "Select config, score from historique where config in ( select idC from configuration where mode ='Easy' and joueur in (select idJ from joueur where pseudo = '" + nom + "'))ORDER BY score DESC LIMIT 1";
        resultat = requete.executeQuery(sql);
        if (resultat.next()) {
            out[0] = "Easy " + resultat.getString("config") + " " + resultat.getString("score");
        } else {
            out[0] = "Easy ";
        }
        sql = "Select config, score from historique where config in ( select idC from configuration where mode ='Medium' and joueur in (select idJ from joueur where pseudo = '" + nom + "'))ORDER BY score DESC LIMIT 1";
        resultat = requete.executeQuery(sql);

        if (resultat.next()) {
            out[1] = "Medium " + resultat.getString("config") + " " + resultat.getString("score");
        } else {
            out[1] = "Medium ";
        }
        sql = "Select config, score from historique where config in ( select idC from configuration where mode ='Hard' and joueur in (select idJ from joueur where pseudo = '" + nom + "'))ORDER BY score DESC LIMIT 1";
        resultat = requete.executeQuery(sql);

        if (resultat.next()) {
            out[2] = "Hard " + resultat.getString("config") + " " + resultat.getString("score");
        } else {
            out[2] = "Hard ";
        }
        return out;
    }

    public String[] getStats(String mode) throws SQLException {   // mode       Easy  / Medium / Hard 
        //les TOP 10 sont ok  faut juste remplacer   joueur par son pseudo

        requete = connec.createStatement();
        // il ne faut pas utiliser group by mais order by....
        //
        //  --> ok  String sql = "Select joueur, config, score from historique where config in ( select idC from configuration where mode ='" + mode + "') ORDER BY score DESC LIMIT 10";
        String sql = "Select pseudo, config, score from historique join joueur on historique.joueur=joueur.idJ where config in ( select idC from configuration where mode ='" + mode + "') ORDER BY score DESC LIMIT 10";
        resultat = requete.executeQuery(sql);
        //------------ permet de savoir le nombre lignes retourné par SQL 
        resultat.last();
        int z = resultat.getRow();
        String[] out = new String[z];
        //-------------------
        resultat.beforeFirst();
        int i = 0;
        while (resultat.next()) {
            out[i] = resultat.getString("pseudo") + " " + resultat.getString("config") + " " + resultat.getString("score");
            i++;
        }
        return out;
    }

    //--------------- main de test
    public static void main(String[] args) throws SQLException {

        BddMastermind test = new BddMastermind();
        test.connexion();
        int i = test.getIdconf(8, 8);
        System.out.println(" " + i);
        test.deconnexion();

    }
}
